package cn.genmer.test.security.writtenTest.alibaba;

import java.util.concurrent.*;

/**
 * 第一种方式： 创建线程执行 - 实现Runnable接口， 实例化FutureTask，通过Thread的构造方法执行异步线程
 * 循环确认异步线程是否完成，完成获取结果
 */
public class Async { public static void main(String[] args) {
    long start=System.currentTimeMillis();
    // 在这⾥创建⼀个线程或线程池，
    // 异步执⾏下⾯的⽅TextMatch.java法 TODO

    // 定义Callable
    Callable<Integer> callable = new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            int result = sum();
            return result;
        }
    };
    // 确保拿到result 并输出
    FutureTask<Integer> task = new FutureTask<Integer>(callable);
    new Thread(task,"子线程").start();
    try {
        while (true){
            // 循环确认子线程执行完成后，获取结果
            if (task.isDone()){
                //获取子线程的返回值
                Integer result = task.get();
                // 这里调用数据存储方法 - 模拟数据存储
                // xxserver.save(result);
                System.out.println("异步计算结果为："+ task.get());
                System.out.println("使⽤时间："+ (System.currentTimeMillis()-start) + " ms");
                break;
            }
        }
    }  catch (Exception e) {
        e.printStackTrace();
    }
    // 然后退出main线程
    }

    private static int sum() {
    return fibo(20); }

    private static int fibo(int a) {
    if ( a < 2) { return 1; }

    return fibo(a-1) + fibo(a-2);
}
}